package ejercicios.ejercicio8;


public class gestorDatos {
	
	private muestraSensores muestraActual = new muestraSensores();
	private boolean hayValorTemperatura   = false;
	private boolean hayValorPresión       = false;
	private int nLecturasMax;
	private int nLecturas                 = 0;
	
	public gestorDatos(int nLecturasMax) {		
		this.nLecturasMax = nLecturasMax;
	}
	
	public synchronized void notificarTemperatura(float temperatura){

		System.out.println("++++ El lector de Temperatura escribe: " + temperatura);
		
		muestraActual.muestraTemperatura = temperatura;

		if (hayValorTemperatura && hayValorPresión) { 
			hayValorPresión = false;
			}	 
		else {
			hayValorTemperatura = true;
			if (hayValorPresión) {
				notify();
			}
			}
	}
	

	public synchronized void notificarPresión(float presión){

		System.out.println("**** El lector de Presión escribe: " + presión);
		
		muestraActual.muestraPresión = presión;

		if (hayValorTemperatura && hayValorPresión) { 
			hayValorTemperatura = false;
			}	 
		else {
			hayValorPresión = true;
			if (hayValorTemperatura){
				notify();
				}
			}
	}

	
	public synchronized muestraSensores obtenerValorSensores (){
		
		// En este problema no es necesario poner la condición de espera
		// en un while. Seróa suficiente un if. Esto es debido a que 
		// solo hay un proceso que lee los valores y óste es el ónico
		// que se puede quedar bloqueado en el monitor. Sin embargo,
		// se ha mantenido el while, como norma de buen uso.
		//
		// Por esta razón, no es necesario incluir un notifyAll apra
		// despertar al proceso que procesa los datos de los sensores.
		
		if (!(hayValorTemperatura && hayValorPresión)) {
			System.out.println("!!!! El Procesador se bloquea");
		}
		
		try{
			while (!(hayValorTemperatura && hayValorPresión)){wait();}
		} catch (InterruptedException ie) {}
		
	    hayValorTemperatura = false;
	    hayValorPresión = false;
	    nLecturas ++;
	    return new muestraSensores(muestraActual.muestraTemperatura, muestraActual.muestraPresión);		
	}
	
	public synchronized boolean condiciónFin () {
		return nLecturas == nLecturasMax;
	}
	
}

